package com.xjie.net;

import java.util.concurrent.*;

/**
 * public ThreadPoolExecutor(
 * int corePoolSize,//参数一：corePoolSize : 指定线程池的核心线程的数量。[正式工]:
 * int maximumPoolSize,//参数二：maximumPoolSize：指定线程池的最大线程数量。[最大员工数]
 * long keepAliveTim,//参数三：keepAliveTime ：指定临时线程的存活时间。[临时工空闲多久被开除]
 * TimeUnit uni,//参数四：unit：指定临时线程存活的时间单位(秒、分、时、天）[]
 * BlockingQueue<Runnable> workQueu,//参数五：workQueue：指定线程池的任务队列。[客人排队的地方]
 * ThreadFactory threadFactor,//参数六：threadFactory：指定线程池的线程工厂。[负责招聘员工的hr]
 * RejectedExecutionHandler handler//参数七：handler：指定线程池的任务拒绝策略（线程都在忙，任务队列也满了的时候，新任务来了该怎么处理）
 * [忙不过来咋办?])
 */
public class ExecutorServiceDemo1 {
    public static void main(String[] args) throws InterruptedException {
        // 创建线程池对象来使用
        // 3个核心线程，最多5个线程，任务队列容量为3
        ExecutorService pool = new ThreadPoolExecutor(3, 5,
                1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        System.out.println("开始提交任务...");



        // 前3个任务会立即由核心线程执行
        System.out.println("提交前3个任务，由核心线程执行:");
        pool.execute(new MyRunnable()); // 第1个任务
        pool.execute(new MyRunnable()); // 第2个任务
        pool.execute(new MyRunnable()); // 第3个任务

        Thread.sleep(100); // 短暂等待，确保前3个任务已经开始执行

        // 接下来的3个任务会进入队列等待
        System.out.println("提交第4-8个任务，进入队列等待:");
        pool.execute(new MyRunnable()); // 存储在任务队列1
        pool.execute(new MyRunnable()); // 存储在任务队列2
        pool.execute(new MyRunnable()); // 存储在任务队列3
        pool.execute(new MyRunnable()); // 存储在任务队列3
        pool.execute(new MyRunnable()); // 存储在任务队列3

        Thread.sleep(100); // 短暂等待

        // 第7和第8个任务会触发创建临时线程（因为核心线程都在忙，队列也满了）
        System.out.println("提交第9-10个任务，触发创建临时线程:");
        pool.execute(new MyRunnable()); // 到了临时线程创建的时机1:核心线程都在忙,且任务队列也满了,且还可以创建临时线程
        pool.execute(new MyRunnable()); // 到了临时线程创建的时机2:核心线程都在忙,且任务队列也满了,且还可以创建临时线程


        Thread.sleep(100); // 短暂等待

        // 第9个任务会触发拒绝策略（核心线程都在忙，队列满了，临时线程也满了）
//        System.out.println("提交第9个任务，触发拒绝策略:");
//        try {
//            pool.execute(new MyRunnable()); // 到了任务拒绝策略:核心线程都在忙,且任务队列也满了,且临时线程也满了
//        } catch (RejectedExecutionException e) {
//            System.out.println("任务被拒绝: " + e.getMessage());
//        }

        // 等待足够时间让所有任务执行完毕
//        Thread.sleep(5000);
//
//        // 关闭线程池
//        System.out.println("关闭线程池");
        pool.shutdown();
    }
}

